﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CMD_WEB.DAL;
using System.Data.SqlClient;

namespace CMD.BAL.SOL
{
    public class Solicitud
    {        
        #region Propiedades

        public Dictionary<string, string> parametros;
        public DataSet dsSolicitud;
        
        //----------------------------- CONTADORES
        int contTodas;
        public int ContTodas
        {
            get { return contTodas; }
            set { contTodas = value; }
        }

        int contAltas;
        public int ContAltas
        {
            get { return contAltas; }
            set { contAltas = value; }
        }

        int contModificaciones;
        public int ContModificaciones
        {
            get { return contModificaciones; }
            set { contModificaciones = value; }
        }

        int contReemplazos;
        public int ContReemplazos
        {
            get { return contReemplazos; }
            set { contReemplazos = value; }
        }

        int contEnProceso;
        public int ContEnProceso
        {
            get { return contEnProceso; }
            set { contEnProceso = value; }
        }

        int contAprobadas;
        public int ContAprobadas
        {
            get { return contAprobadas; }
            set { contAprobadas = value; }
        }

        int contBorradores;
        public int ContBorradores
        {
            get { return contBorradores; }
            set { contBorradores = value; }
        }

        int contEnviando;
        public int ContEnviando
        {
            get { return contEnviando; }
            set { contEnviando = value; }
        }

        int contCancelada;
        public int ContCancelada
        {
            get { return contCancelada; }
            set { contCancelada = value; }
        }

        int contRechazada;
        public int ContRechazada
        {
            get { return contRechazada; }
            set { contRechazada = value; }
        }
        //-----------end contadores
        //-----------contadores por rol
        int contTodasRol;
        public int ContTodasRol
        {
            get { return contTodasRol; }
            set { contTodasRol = value; }
        }

        int contAltasRol;
        public int ContAltasRol
        {
            get { return contAltasRol; }
            set { contAltasRol = value; }
        }

        int contModificacionesRol;
        public int ContModificacionesRol
        {
            get { return contModificacionesRol; }
            set { contModificacionesRol = value; }
        }

        int contReemplazosRol;
        public int ContReemplazosRol
        {
            get { return contReemplazosRol; }
            set { contReemplazosRol = value; }
        }

        int contEnProcesoRol;
        public int ContEnProcesoRol
        {
            get { return contEnProcesoRol; }
            set { contEnProcesoRol = value; }
        }

        int contAprobadasRol;
        public int ContAprobadasRol
        {
            get { return contAprobadasRol; }
            set { contAprobadasRol = value; }
        }

        int contBorradoresRol;
        public int ContBorradoresRol
        {
            get { return contBorradoresRol; }
            set { contBorradoresRol = value; }
        }

        int contEnviandoRol;
        public int ContEnviandoRol
        {
            get { return contEnviandoRol; }
            set { contEnviandoRol = value; }
        }

        int contCanceladaRol;
        public int ContCanceladaRol
        {
            get { return contCanceladaRol; }
            set { contCanceladaRol = value; }
        }

        int contRechazadaRol;
        public int ContRechazadaRol
        {
            get { return contRechazadaRol; }
            set { contRechazadaRol = value; }
        }
        //------------end contadores por rol

        //---------------------------- UNIDs
        long unid_solicitud;

        public long Unid_solicitud
        {
            get { return unid_solicitud; }
            set { unid_solicitud = value; }
        }
        long unid_docinfo;

        public long Unid_docinfo
        {
            get { return unid_docinfo; }
            set { unid_docinfo = value; }
        }
        long unid_datos;

        public long Unid_datos
        {
            get { return unid_datos; }
            set { unid_datos = value; }
        }
        long unid_datosgral;

        public long Unid_datosgral
        {
            get { return unid_datosgral; }
            set { unid_datosgral = value; }
        }
        long unid_dirfiscal;

        public long Unid_dirfiscal
        {
            get { return unid_dirfiscal; }
            set { unid_dirfiscal = value; }
        }
        long unid_direntrega;

        public long Unid_direntrega
        {
            get { return unid_direntrega; }
            set { unid_direntrega = value; }
        }
        long unid_rfv;

        public long Unid_rfv
        {
            get { return unid_rfv; }
            set { unid_rfv = value; }
        }
        long unid_dpv;

        public long Unid_dpv
        {
            get { return unid_dpv; }
            set { unid_dpv = value; }
        }
        long unid_infoad;

        public long Unid_infoad
        {
            get { return unid_infoad; }
            set { unid_infoad = value; }
        }
        long unid_datosbanc;

        public long Unid_datosbanc
        {
            get { return unid_datosbanc; }
            set { unid_datosbanc = value; }
        }
        long unid_interlocutores;

        public long Unid_interlocutores
        {
            get { return unid_interlocutores; }
            set { unid_interlocutores = value; }
        }
        long unid_documentos;

        public long Unid_documentos
        {
            get { return unid_documentos; }
            set { unid_documentos = value; }
        }
        long unid_wf;

        public long Unid_wf
        {
            get { return unid_wf; }
            set { unid_wf = value; }
        }
        long id_status;

        public long Id_status
        {
            get { return id_status; }
            set { id_status = value; }
        }
        long id_prioridad;

        public long Id_prioridad
        {
            get { return id_prioridad; }
            set { id_prioridad = value; }
        }
        long id_tipo;

        public long Id_tipo
        {
            get { return id_tipo; }
            set { id_tipo = value; }
        }
        public string unidRol;
        //------------------------------------------------

        #endregion

        public Solicitud() 
        {
            parametros = new Dictionary<string,string>();
            //loadCounters();
            //loadCountersRol(unidRol);
        }


        /// <summary>
        /// Obtiene los UNIDs relacionados con el UNID de la actual Solicitud e inicializa propiedades del objeto con dichos valores
        /// </summary>
        /// <param name="id">UNID de la solicitud</param>
        public Solicitud(string id)
        {
            //loadCounters();
            loadCountersRol(unidRol);

            if (id == "" || id == null)
                return;

            dsSolicitud = new DataSet();
            string qryGetUNIDs = "Exec SP_CMD_GET_UNIDs " + id;

            try
            {
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryGetUNIDs));

                unid_solicitud = long.Parse(id);
                unid_docinfo = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DOCINFO"].ToString());
                unid_datos = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DATOS"].ToString());
                unid_datosgral = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DATOSGRAL"].ToString());
                unid_datosbanc = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DATOSBANC"].ToString());
                unid_dirfiscal = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DIRFISCAL"].ToString());
                unid_direntrega = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DIRENTREGA"].ToString());
                unid_rfv = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_RFV"].ToString());
                unid_dpv = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DPV"].ToString());
                unid_infoad = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_INFOAD"].ToString());
                unid_interlocutores = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_INTERLOCUTORES"].ToString());
                unid_documentos = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_DOCUMENTOS"].ToString());
                unid_wf = long.Parse(dsSolicitud.Tables[0].Rows[0]["UNID_SOLICITUD_WF"].ToString());
                id_status = long.Parse(dsSolicitud.Tables[0].Rows[0]["ID_SOLICITUD_STATUS"].ToString());
                id_prioridad = long.Parse(dsSolicitud.Tables[0].Rows[0]["ID_PRIORIDAD"].ToString());
                id_tipo = long.Parse(dsSolicitud.Tables[0].Rows[0]["ID_TIPO_SOLICITUD"].ToString());


                GetSolicitud();

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end constructor

        /// <summary>
        /// Actualiza/Inserta. 
        /// </summary>
        /// <param name="param">Diccionario que contiene el nombre y valor de los parámetros que necesita el SP.</param>
        //public string UpsertData()
        //{
        //    string mensaje = "";
        //    //parametros = new Dictionary<string, string>();
        //    DataSet result = new DataSet();
        //    SqlCommand sp = new SqlCommand("SP_CMD_UPSERT_SOL");
        //    sp.CommandType = CommandType.StoredProcedure;

        //    try
        //    {
        //        foreach (KeyValuePair<string, string> p in parametros)
        //        {
        //            sp.Parameters.AddWithValue(p.Key, p.Value);
        //        }//foreach

        //        result = SrvDB.ExecuteCommand(sp);

        //        if (result.Tables.Count == 1)
        //            mensaje = "Se ha guardado su solicitud.";
        //        if(result.Tables.Count == 2)
        //            mensaje = result.Tables[0].Rows[0][0].ToString()+ ": "+result.Tables[1].Rows[0][0].ToString();
        //        if (result.Tables.Count == 3)
        //            mensaje = result.Tables[1].Rows[0][0].ToString() + "\n " + result.Tables[0].Rows[0][0].ToString() + "\n " + result.Tables[2].Rows[0][0].ToString();
        //        if (result.Tables.Count == 0)
        //            mensaje = "No se ha podido guardar su solicitud. Error a nivel de BD sin excepción lanzada.";
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }

        //    return mensaje;
        //}//end 
        
        /// <summary>
        /// Obtiene los registros de las Solicitudes en base su Status y Tipo
        /// </summary>
        /// <param name="todas">Determina si se seleccionan todas las solicitudes</param>
        /// <param name="idStatus">Id del status (filtro)</param>
        /// <param name="idTipo">Id del Tipo de Solicitud (filtro)</param>
        /// <returns></returns>
        /// 
        /*
        public  DataTable GetData(bool todas,int idStatus, int idTipo)
        {
            DataTable solicitudes = new DataTable();
            string query = "Exec SP_CMD_SEL_SOL";

            if (todas)
                query = query + " 1,0,0";
            else {
                query = query + " 0," + idStatus.ToString() + "," + idTipo.ToString();
            }

            try
            {
                solicitudes = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return solicitudes;
        }// end GetData
         */
        public DataTable GetDataRol(bool todas, int idStatus, int idTipo,string unidRol)
        {
            DataTable solicitudes = new DataTable();
            string query = "Exec SP_CMD_SEL_SOL_WEB";

            if (todas)
                query = query + " 1,0,0,"+ unidRol.ToString();
            else
            {
                query = query + " 0," + idStatus.ToString() + "," + idTipo.ToString() + "," +unidRol.ToString();
            }

            try
            {
                solicitudes = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return solicitudes;
        }// end GetData

        /// <summary>
        /// Elimina los registros cuyo Id recibe como parámetro de la tabla de Solicitudes
        /// </summary>
        /// <param name="ids">Cadena de Ids separados por coma</param>
        public static void DeleteData(string ids)
        {
            int rowsAffected = 0;
            string query = "Exec SP_CMD_DELETE_SOL '" + ids + "'";

            try
            {
                rowsAffected = SrvDB.ExecuteNonQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end DeleteData

        /// <summary>
        /// Asigna los contadores de solicitudes por tipo y status
        /// </summary>
        /// 
        /*
        private void loadCounters()
        {
            DataSet contadores = new DataSet();
            
            string qryStatus = "Exec SP_CMD_SOL_COUNT_STATUS";
            string qryTipo = "Exec SP_CMD_SOL_COUNT_TIPO";

            try
            {
                contadores.Tables.Add(GetData(true, 0, 0));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryStatus));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryTipo));

                ContTodas = contadores.Tables[0].Rows.Count;

                ContAltas = int.Parse(contadores.Tables[2].Rows[0]["Cont"].ToString());
                ContModificaciones = int.Parse(contadores.Tables[2].Rows[1]["Cont"].ToString());
                ContReemplazos = int.Parse(contadores.Tables[2].Rows[2]["Cont"].ToString());

                ContBorradores = int.Parse(contadores.Tables[1].Rows[0]["Cont"].ToString());
                ContEnviando = int.Parse(contadores.Tables[1].Rows[1]["Cont"].ToString());
                ContEnProceso = int.Parse(contadores.Tables[1].Rows[1]["Cont"].ToString());
                ContAprobadas = int.Parse(contadores.Tables[1].Rows[2]["Cont"].ToString());
                ContCancelada = int.Parse(contadores.Tables[1].Rows[4]["Cont"].ToString());
                ContRechazada = int.Parse(contadores.Tables[1].Rows[5]["Cont"].ToString());

            }
            catch (Exception ex)
            {
                throw ex;
            }


        }// end loadCounters
         */

        private void loadCountersRol(string unidRol)
        {
            DataSet contadores = new DataSet();

            string qryStatusRol = "Exec SP_CMD_SOL_COUNT_STATUSXROL'" + unidRol + "'";
            string qryTipoRol = "Exec SP_CMD_SOL_COUNT_TIPOXROL'" + unidRol + "'";

            try
            {
                contadores.Tables.Add(GetDataRol(true, 0, 0, "0"));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryStatusRol));
                contadores.Tables.Add(SrvDB.ExecuteQuery(qryTipoRol));

                contTodasRol = contadores.Tables[0].Rows.Count;

                ContAltasRol = int.Parse(contadores.Tables[2].Rows[0]["Cont"].ToString());
                ContModificacionesRol = int.Parse(contadores.Tables[2].Rows[1]["Cont"].ToString());
                ContReemplazosRol = int.Parse(contadores.Tables[2].Rows[2]["Cont"].ToString());

                ContBorradoresRol = int.Parse(contadores.Tables[1].Rows[0]["Cont"].ToString());
                ContEnviandoRol = int.Parse(contadores.Tables[1].Rows[1]["Cont"].ToString());
                ContEnProcesoRol = int.Parse(contadores.Tables[1].Rows[2]["Cont"].ToString());
                ContAprobadasRol = int.Parse(contadores.Tables[1].Rows[3]["Cont"].ToString());
                ContCanceladaRol = int.Parse(contadores.Tables[1].Rows[4]["Cont"].ToString());
                ContRechazadaRol = int.Parse(contadores.Tables[1].Rows[5]["Cont"].ToString());

            }
            catch (Exception ex)
            {
                throw ex;
            }


        }// end loadCounters

        /// <summary>
        /// Obtiene los datos de la Solicitud actual
        /// </summary>
        private void GetSolicitud()
        {
            string qryDatos = "Exec SP_CMD_GET_SOL_DATOS "+ unid_datos;
            string qryDatosgral = "Exec SP_CMD_GET_SOL_DATOSGRAL " + unid_datosgral;
            string qryDatosbanc = "Exec SP_CMD_GET_SOL_DATOSBANC " + unid_datosbanc;
            string qryDirentrega = "Exec SP_CMD_GET_SOL_DIRENTREGA " + unid_direntrega;
            string qryDirfiscal = "Exec SP_CMD_GET_SOL_DIRFISCAL " + unid_dirfiscal;
            string qryDocInfo = "Exec SP_CMD_GET_DOCINFO " + unid_docinfo;
            string qryDocumentos = "Exec SP_CMD_GET_SOL_DOCUMENTOS " + unid_documentos;
            string qryInfoad = "exec SP_CMD_GET_SOL_INFOAD " + unid_infoad;
            string qryInterlocutores = "exec SP_CMD_GET_SOL_INTERLOCUTORES " + unid_interlocutores;
            string qryPrioridad = "exec SP_CMD_GET_SOL_PRIORIDAD " + id_prioridad;
            string qryRfv = "exec SP_CMD_GET_SOL_RFV " + unid_rfv;
            string qryStatus = "exec SP_CMD_GET_SOL_STATUS "+ id_status;
            string qryTipo = "exec SP_CMD_GET_SOL_TIPO " + id_tipo;
            string qryWf = "exec SP_CMD_GET_SOL_WF " + unid_wf;
            
            try
            {
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDatos)); //table 2
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDatosgral)); //table 3
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDatosbanc)); //table 4
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDirentrega)); //table 5
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDirfiscal)); //table 6
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryDocumentos)); //table 7
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryInterlocutores)); //table 8
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryPrioridad)); //table 9
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryRfv)); //table 10
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryStatus)); //table 11
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryTipo)); //table 12
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryWf)); //table 13
                dsSolicitud.Tables.Add(SrvDB.ExecuteQuery(qryInfoad)); //table 14


            }
            catch (Exception ex)
            {
                throw ex;
            }

        }//end GetSolicitud

        /// <summary>
        /// Agrega elementos al Diccionario de parámetros para el Upsert
        /// </summary>
        /// <param name="key">Nombre de la Key que se agregará al Diccionario de parámetros</param>
        /// <param name="value">Valor de la Key que se agregará al Diccionario de parámetros</param>
        public void SetDictionaryParameterValues(string key, string value)
        {
            #region param
            /*
            string unidSolicitud;

            string datsol_unidSolicitudDatos;
            string datsol_unidTipoSolicitante;
            string datsol_isMismoDomicilio;
            string datsol_isProveedor;
            string datsol_isOtrasCategorias;
            string datsol_isOtrosClientes;
            string datsol_idTipoPersonaFiscal;

            string datgral_unidSolicitud;
            string datgral_idTipoNeg;
            string datgral_razonSocial;
            string datgral_rfc;
            string datgral_correo;
            string datgral_nombreSucursal;
            string datgral_numSucursal;

            string dirFis_unidDirFiscal;
            string dirFis_calle;
            string dirFis_numExt;
            string dirFis_numInt;
            string dirFis_unidSepomex;
            string dirFis_lada;
            string dirFis_tel;

            string dirEnt_unidDirEntrega;
            string dirEnt_calle;
            string dirEnt_numExt;
            string dirEnt_numInt;
            string dirEnt_unidSepomex;
            string dirEnt_lada;
            string dirEnt_tel;

            string datRFV_unidRFV;
            string datRFV_ter;
            string datRFV_idLeadTime;
            string datRFV_subdir;
            string datRFV_geren;
            string datRFV_idClo;

            string datDPV_unidDPV;
            string datDPV_nom;
            string datDPV_tel;
            string datDPV_titulo;
            string datDPV_correo;
            string datDPV_idZona;
            string datDPV_diasCol;
            string datDPV_diasEnt;
            string datDPV_idMedCol;
         S   string datDPV_idFrec;
            string datDPV_idIva;

            string datBnc_unidBanc;
            string datBnc_idBanc;
            string datBnc_ctaBanc;
            string datBnc_suc;

            string sol_idTipoSol;
            string sol_idPrio;
            string sol_idSolStat;

            string docInfo_unidDocInfo;
            string docInfo_fechaEnvio;
            string docInfo_wUsr;
            string docInfo_pcname;
            string docInfo_dktVersion;
            string docInfo_userUltimo;
            string docInfo_wUsrMail;

            string doctos_unidDocs;
            string doctos_ruleDoc;
            string doctos_documento;
            string doctos_genFileName;
            string doctos_dateLoaded;
            string doctos_orgFileName;

            string infoad_unidInfoad;
            string infoad_respoFDV;
            string infoad_numEmpleado;
            */
            #endregion

            parametros.Add(key, value);
        }

        public void CreateDocInfo()
        { 
            //SP_CMD_UPSERT_SOL_DOCINFO
            /*
            @FECHA_ENVIO datetime,
            @WUSER_CREADOR nvarchar(512),
            @PCNAME nvarchar(512),
            @CMD_DKT_VERSION int,
            @USER_ULTIMO_MOD nvarchar(512),
            @WUSER_CRAEDOR_MAIL
             */
        }//end CreateDocInfo
    }// end class
}